package com.adee.java;

/**
* 你们的项目如何排查JVM问题：
* 对于还在正常运行的系统：
* 1. 可以使用jmap生成dump文件来查看jvm各个区域的使用情况；
* 2. 可以使用jstack来查看线程的运行情况，比如那些线程阻塞，是否出现了死锁；
* 3. 可以通过jstat命令来查看垃圾回收情况，特别是fullgc，fullgc的stw时间较长，如果发现fullgc比较频繁，那么就得进行调优了；
* 4. 通过各个命令的结果，或者jvisualvm等工具来进行分析；
* 5. 首先，初步猜测频繁发生fullgc的原因，如果频繁发生fullgc，但又没出现内存溢出，那么表示fullgc回收了很多对象了，所以这些对象
*    最好能在younggc过程就直接回收掉，避免这些对象进入老年代，对于这种情况，就要考虑存活时间不长的对象是不是比较大，导致年轻代
*    放不下，直接进入了老年代，尝试加大年轻代的大小，如果改完之后，fullgc减少，说明修改有效；
* 6. 同时，还可以找到占用cpu最多的线程，定位到具体的方法，优化这个方法的执行，看是否能避免某些对象的创建，从而节省内存。
* 7. cpu使用率很高，首先 top命令，然后P按cpu使用率降序排列，找到cpu使用率最高的jvm进程id，然后用 top -Hp 进程id，找到cpu使用率最高
 *   的线程id，然后jstack命令导出线程dump文件，再从中找出该线程id的调用栈，定位到哪个方法导致cpu使用率过高。
* 对于已经发生OOM的系统：
* 1. 一般生产系统都会设置当系统发生了OOM时，生成当时的Dump文件（-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/base）；
* 2. 我们可以利用visualvm等工具来分析dump文件；
* 3. 根据Dump文件找到异常的实例对象，和异常的线程（占用cpu高），定位到具体的代码；
* 4. 然后再进行详细的分析和调试。
* 总之，调优不是一蹴而就的，需要分析、推理、实践、总结、再分析，最终定位到具体的问题。
*
* */
public class Test019_JVM_problems {
    public static void main(String[] args) {

    }
}
